package com.hliushi.creation;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 简单工厂模式 {静态工程} 案例
 * <p>
 * 缺点: 当系统中需要引入新的产品时, 由于静态工厂方法通过所传入的参数
 * .      不同来创建不同的产品, 这必定要修改工厂类的源代码, 这违背"开闭原则"
 *
 * @author llhuang10
 * @date 2021/8/19 11:17
 */
public class _01SimpleFactory {

    private static final Logger LOGGER = LoggerFactory.getLogger(_01SimpleFactory.class);

    public static void main(String[] args) {
        Graph rectangle = GraphFactory.createGraph("A");
        Graph square = GraphFactory.createGraph("B");

        rectangle.printArea();
        // assert square != null;
        square.printArea();
    }


    static abstract class Graph {
        /**
         * 所有产品类的公共业务方法
         * e
         */
        public void print() {
            // 公共方法的实现
            System.out.println("我是一个公共方法");
        }


        /**
         * 声明抽象业务方法
         * e
         */
        public abstract void printArea();
    }


    static class Rectangle extends Graph {

        @Override
        public void print() {
            super.print();
        }

        @Override
        public void printArea() {
            System.out.println("我是长方形");
        }
    }

    static class Square extends Graph {
        @Override
        public void print() {
            super.print();
        }

        @Override
        public void printArea() {
            System.out.println("我是正方形");
        }
    }

    static class GraphFactory {

        public static Graph createGraph(String val) {
            if (val.equalsIgnoreCase("A")) {
                return new Rectangle();
            } else if (val.equalsIgnoreCase("B")) {
                return new Square();
            }
            return null;
        }
    }

}
